package com.zzyl.nursing.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 中国大陆身份证号码工具类
 */
public class IdCardUtils {
    
    /**
     * 从身份证号码中提取生日
     * 
     * @param idCard 身份证号码（18位）
     * @return 生日对应的LocalDateTime
     * @throws IllegalArgumentException 身份证号码格式不正确时抛出异常
     */
    public static LocalDateTime getBirthDate(String idCard) {
        validateIdCard(idCard);
        
        try {
            // 18位身份证号码中，第7-14位为出生日期（YYYYMMDD格式）
            String birthDateString = idCard.substring(6, 14);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            LocalDate birthDate = LocalDate.parse(birthDateString, formatter);
            return birthDate.atStartOfDay();
        } catch (Exception e) {
            throw new IllegalArgumentException("身份证号码中的出生日期格式不正确", e);
        }
    }
    
    /**
     * 从身份证号码中计算年龄
     * 
     * @param idCard 身份证号码（18位）
     * @return 年龄
     * @throws IllegalArgumentException 身份证号码格式不正确时抛出异常
     */
    public static Integer getAge(String idCard) {
        validateIdCard(idCard);
        
        LocalDateTime birthDate = getBirthDate(idCard);
        LocalDate currentDate = LocalDate.now();
        
        // 计算年龄
        return java.time.Period.between(birthDate.toLocalDate(), currentDate).getYears();
    }
    
    /**
     * 从身份证号码中获取性别
     * 
     * @param idCard 身份证号码（18位）
     * @return 性别（1表示男性，0表示女性）
     * @throws IllegalArgumentException 身份证号码格式不正确时抛出异常
     */
    public static Integer getGender(String idCard) {
        validateIdCard(idCard);
        
        // 18位身份证号码中，第17位数字用来表示性别
        // 奇数表示男性，偶数表示女性
        char genderChar = idCard.charAt(16);
        int genderDigit = Character.getNumericValue(genderChar);
        
        // 奇数返回1（男性），偶数返回0（女性）
        return genderDigit % 2 == 1 ? 1 : 0;
    }
    
    /**
     * 验证身份证号码格式
     * 
     * @param idCard 身份证号码
     * @throws IllegalArgumentException 身份证号码格式不正确时抛出异常
     */
    private static void validateIdCard(String idCard) {
        if (idCard == null || idCard.trim().isEmpty()) {
            throw new IllegalArgumentException("身份证号码不能为空");
        }
        
        // 去除空格
        idCard = idCard.trim();
        
        // 验证长度
        if (idCard.length() != 18) {
            throw new IllegalArgumentException("身份证号码必须为18位");
        }
        
        // 验证前17位是否都是数字
        for (int i = 0; i < 17; i++) {
            if (!Character.isDigit(idCard.charAt(i))) {
                throw new IllegalArgumentException("身份证号码前17位必须为数字");
            }
        }
        
        // 验证最后一位（可以是数字或X）
        char lastChar = idCard.charAt(17);
        if (!Character.isDigit(lastChar) && Character.toUpperCase(lastChar) != 'X') {
            throw new IllegalArgumentException("身份证号码最后一位必须为数字或X");
        }
    }
    
    // 使用示例
    public static void main(String[] args) {
        // 示例身份证号码（仅用于测试）
        String idCard = "110101199001011234";
        
        try {
            LocalDateTime birthDate = IdCardUtils.getBirthDate(idCard);
            Integer age = IdCardUtils.getAge(idCard);
            Integer gender = IdCardUtils.getGender(idCard);
            
            System.out.println("身份证号码: " + idCard);
            System.out.println("出生日期: " + birthDate);
            System.out.println("年龄: " + age);
            System.out.println("性别: " + (gender == 1 ? "男" : "女"));
        } catch (IllegalArgumentException e) {
            System.err.println("身份证号码解析失败: " + e.getMessage());
        }
    }
}
